home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 15 / AMIGAplus Sonderheft 15 (1998)(ICP)(DE)[!].iso / rexx / animpath.pprx < prev    next >
Text File  |  1998-01-24  |  60KB  |  1,986 lines

  1. /* Personal Paint Amiga Rexx script - Copyright © 1997 Cloanto Italia srl */
  2.  
  3. /* $VER: AnimPath.pprx 1.3 */
  4.  
  5. /** ENG
  6.  This script can be used to easily create animations with
  7.  moving and transforming objects.
  8.  
  9.  The main requester gives access to the following commands:
  10.  
  11.  - New: the path is cleared and the brush transformations are set
  12.    to their defaults.
  13.  
  14.  - Load: an existing path file can be selected using the file requester;
  15.    this causes the path coordinates, the brush transformation settings
  16.    and the animation settings to be loaded (note: this data
  17.    is stored in ASCII format and can easily be algorithmically
  18.    generated and manipulated by other programs).
  19.  
  20.  - Save: this command writes a path file using the current path data.
  21.  
  22.  - Define Freehand: the mouse can be used to "draw" the path;
  23.    both the direction of the path and the mouse movement speed
  24.    affect the resulting animation: the original direction
  25.    is used to render the frames (the starting point is used
  26.    to place the object in the first frame and the last point
  27.    is used for the last frame) and the drawing speed
  28.    affects the number and the "density" of stored points
  29.    (the slower the speed, the more points, and
  30.    vice versa) and defines the perceived speed of the animation
  31.    (e.g. a path defined with a high initial speed and a slow
  32.    ending speed leads to a corresponding animation).
  33.    Before the mouse button is pressed, the brush is displayed to ease
  34.    positioning in the first frame. All drawing must occur holding
  35.    down the left mouse button, releasing it only at the end
  36.    of the definition.
  37.  
  38.  - Define Linear: the mouse can be used to define a linear path
  39.    (simply consisting of a starting point and an ending point);
  40.    unlike the freehand path, this kind of path produces a
  41.    constant-speed animation (equally-spaced intermediate points
  42.    are generated automatically). To define the path, press the left
  43.    mouse button on the starting point, and release it at the end.
  44.  
  45.  - Edit: this command can be used to visually edit the path;
  46.    the "path points" can be dragged with the mouse to change the
  47.    path shape and/or density (speed); the <m> key toggles
  48.    the magnify mode on or off, and the right mouse button or the <Esc> key
  49.    can be pressed to leave the editing mode.
  50.  
  51.  - Move and Resize: the mouse can be used to resize the animation
  52.    path (clicking on the lower right part of the path) or to drag it
  53.    to a new position (clicking on the upper part). This is useful
  54.    to create paths with point outside the screen, which cannot be
  55.    drawn by hand. The <m> key toggles the magnify mode on or off, and
  56.    the right mouse button or the <Esc> key can be pressed
  57.    to exit from the move and resize mode.
  58.  
  59.  - Brush Angle: the Brush Angle requester is used to set
  60.    the number of brush rotations ("Rotation Cycles"), the starting
  61.    ("From Angle") and ending angle ("To Angle"), and the
  62.    rotation direction ("Direction": "Clockwise/Counterclockwise");
  63.    a number of rotations greater than 1 can be used to add
  64.    additional 360° spins in the specified direction.
  65.  
  66.  - Brush Shear: the Brush Shear requester is used to set
  67.    the number of shear cycles ("Shear Cycles"), the starting and
  68.    ending horizontal shear ("From Horizontal", "To Horizontal"),
  69.    and the starting and ending vertical shear ("From Vertical",
  70.    "To Vertical"); if a number of shear cycles greather than 1 is specified,
  71.    the shear factors will move back and forth within the specified
  72.    limits (an odd number of cycles must be used to reach the ending
  73.    shear in the last frame).
  74.  
  75.  - Brush Size: the Brush Size requester is used to set
  76.    the number of resize cycles ("Resize Cycles"), the starting and
  77.    ending horizontal size ("From Horizontal", "To Horizontal",
  78.    in percentage of the original size), and the starting and ending
  79.    vertical size ("From Vertical", "To Vertical");
  80.    if a number of resize cycles greather than 1 is specified,
  81.    the resize factors will move back and forth within the specified
  82.    limits (an odd number of cycles must be used to reach the ending
  83.    size in the last frame).
  84.  
  85.  - Data: the data requester can be used to view the path data
  86.    at a glance (animation, rotation, shear and resize settings,
  87.    followed by the path coordinates).
  88.  
  89.  - Preview: this command can be used to preview the animation;
  90.    when one or more brush effects are involved, the brush image
  91.    is replaced by an outline (the inner arrow points to the top
  92.    of the brush).
  93.  
  94.  The main requester also contains gadgets to set the animation
  95.  frames ("Count"), the recording direction ("Direction":
  96.  "Forward/Backward/Still" - the frame step) and the frame insertion option
  97.  ("Add Frames" - if active, "Count" frames are inserted).
  98.  
  99.  When using freehand paths with no brush effect, the "Count"
  100.  setting should not be set to a number greater than the path points
  101.  (as reported by the Data requester), as this would generate one or more
  102.  duplicate frames.
  103.  
  104.  The bottom gadgets in the main requester can be used to render
  105.  the animation ("Draw", which also terminates the script) or to
  106.  quit the script ("Quit"). A copy of the current path is
  107.  always temporarily stored, so that it can be used when the script is
  108.  run again.
  109.  
  110.  The following program settings affect the animation appearance and
  111.  quality: the current brush (anim-brushes can be used to
  112.  create complex animation effects), the brush handle position,
  113.  the brush paint mode (and the foreground color, if the "Color" mode
  114.  is active) and the "Color average resize" option.
  115. */
  116.  
  117. /** DEU
  118.  Dieses Skript ermöglicht die einfache Erzeugung von Animationen, in deren
  119.  Verlauf Objekte bewegt und verwandelt werden.
  120.  
  121.  Im Haupt-Dialogfenster erfolgt der Zugriff auf folgende Befehle:
  122.  
  123.  - Neu: Löscht den alten Pfad und setzt die Pinseltransformationen auf die
  124.    Standardwerte zurück.
  125.  
  126.  - Laden: Mit dem Dateiauswahlfenster läßt sich eine zuvor gespeicherte
  127.    Pfaddatei auswählen. Dabei werden Pfadkoordinaten, Einstellungen für die
  128.    Pinseltransformation und verschiedene Animationseinstellungen geladen.
  129.    Hinweis: Diese Daten liegen im ASCII-Format vor und lassen sich daher auf
  130.    einfache Weise mit Hilfe anderer Programme algorithmisch erzeugen und/oder
  131.    verändern.
  132.  
  133.  - Speichern: Schreibt eine Pfaddatei unter Verwendung der aktuellen
  134.    Pfaddaten.
  135.  
  136.  - Frei festlegen: Ermöglicht die Bestimmung des Pfades mit Hilfe der Maus.
  137.    Sowohl dessen Verlauf als auch die Geschwindigkeit der Mausbewegung
  138.    beeinflussen den späteren Animationsablauf: Die ursprüngliche Richtung wird
  139.    zur Berechnung der Einzelbilder verwendet (Das erste Einzelbild wird am
  140.    Startpunkt berechnet, das letzte dementsprechend am Zielpunkt), während die
  141.    Geschwindigkeit des Zeichenvorgangs sowohl Anzahl als auch Abstand
  142.    ("Dichte") der gespeicherten Punkte beeinflußt. Dabei gilt: Je geringer die
  143.    Geschwindigkeit, desto mehr Punkte, und umgekehrt. Auch die
  144.    Ablaufgeschwindigkeit hängt von diesem Faktor ab, d. h. ein mit hoher
  145.    Anfangs- und geringer Endgeschwindigkeit definierter Pfad erzeugt eine
  146.    dementsprechend mit zunehmend geringerer Geschwindigkeit ablaufende
  147.    Animation. Um die Festlegung der Position für das erste Einzelbild zu
  148.    erleichtern, wird vor der Betätigung der linken Maustaste das aktuelle
  149.    Zeichen angezeigt.
  150.  
  151.  - Linear festlegen: Ermöglicht die Bestimmung eines linearen Pfades, welcher
  152.    lediglich durch Anfangs- und Endpunkt festgelegt wird. Im Gegensatz zum frei
  153.    festgelegten Pfad wird hierdurch eine Animation erzeugt, die über ihren
  154.    gesamten Verlauf hinweg eine konstante Geschwindigkeit beibehält, da die
  155.    Zwischenpunkte automatisch alle im gleichen Abstand voneinander angeordnet
  156.    werden.
  157.  
  158.  - Bearbeiten: Dient zur visuellen Bearbeitung des Pfades. Durch Verschieben
  159.    der einzelnen Knotenpunkte des Pfades mit der Maus lassen sich Form und
  160.    Dichte (Geschwindigkeit) ändern. Mit Hilfe der Taste <m> kann die
  161.    Lupfenfunktion an- oder ausgeschaltet werden. Um den Bearbeitungsmodus zu
  162.    verlassen, ist die <Esc>-Taste zu drücken.
  163.  
  164.  - Position und Größe: Hiermit lassen sich unter Verwendung der Maus Position
  165.    (durch Anklicken des rechten unteren Pfadteils) und Größe (durch Anklicken
  166.    des oberen Teils) des Animationspfades ändern. Dies eignet sich besonders
  167.    zur Erzeugung von Animationspfaden, die aus dem sichtbaren Bereich
  168.    hinauslaufen, da sich diese nicht von Hand zeichnen lassen. Mit <m> läßt
  169.    sich jederzeit die Lupe an- oder ausschalten, und mit <Esc> wird der Modus
  170.    "Position und Bewegung" verlassen.
  171.  
  172.  - Pinsel drehen: In diesem Dialogfenster werden die Anzahl der Umdrehungen
  173.    ("Umdrehungen"), der Startwinkel ("Startwinkel"), der Zielwinkel
  174.    ("Zielwinkel") und der Drehsinn ("Rechts herum/Links herum" festgelegt;
  175.    durch die Angabe eines Wertes >1 lassen sich zusätzliche volle Umdrehungen
  176.    erzeugen.
  177.  
  178.  - Pinsel kippen: In diesem Dialogfenster werden die Anzahl der
  179.    Kippdurchläufe ("Durchläufe") und der Start- und Zielwinkel des Kippvorgangs
  180.    ("Von Winkel", "Bis Winkel") festgelegt; durch die Angabe eines Kipp-Wertes
  181.    >1 pendeln die Kippwerte zwischen den angegebenen Grenzwerten hin und her.
  182.    Hinweis: Um den Kipp-Endwert beim letzten Einzelbild zu erreichen, muß eine
  183.    gerade Anzahl von Durchläufen angegeben werden.
  184.  
  185.  - Pinselgröße: Dieses Dialogfenster dient zum Einstellen der
  186.    Änderungsdurchläufe für die Pinselgröße ("Durchläufe"), der Start- und
  187.    Zielgröße ("Von" und "Bis" in Prozent der ursprünglichen Größe); wenn mehr
  188.    als ein Änderungsdurchlauf festgelegt wird, pendelt der
  189.    Größenänderungsfaktor zwischen den angegebenen Grenzwerten hin und her.
  190.    Hinweis: Um den Endwert beim letzten Einzelbild zu erreichen, muß eine
  191.    gerade Anzahl von Durchläufen angegeben werden.
  192.  
  193.  - Im Daten-Dialogfenster werden alle Pfadinformationen auf einen Blick
  194.    dargestellt: Animation, Zeichen, Umdrehung, Kippwerte, Größeneinstellungen
  195.    und Pfadkoordinaten.
  196.  
  197.  - Vorschau: Mit diesem Befehl läßt sich eine Vorschau der Animation
  198.    betrachten. Wenn ein oder mehrere Pinseleffekte eingesetzt wurden, erscheint
  199.    der Pinsel nur als Umriß. Der darin angezeigte Pfeil zeigt zur
  200.    Pinseloberkante.
  201.  
  202.  Das Haupt-Dialogfenster enthält daneben auch Funktionen zum Festlegen der
  203.  Einzelbilder einer Animation ("Zähler"), der Aufzeichnungsrichtung
  204.  ("Richtung":"Vorwärts/Rückwärts/Stillstand" - die Schrittweite) und zum
  205.  Einfügen von Einzelbildern ("Bilder add." - wenn aktiviert, werden unter
  206.  "Zähler" Bilder hinzugefügt).
  207.  
  208.  Bei der Verwendung eines frei festgelegten Pfades ohne einen Pinseleffekt
  209.  sollte der "Zähler"-Wert die Anzahl der Knotenpunkte des Pfades (wie im
  210.  Daten-Dialogfenster angezeigt) nicht überschreiten, da dies zur Duplizierung
  211.  eines oder mehrerer Einzelbilder führen würde. Die unteren Funktionselemente
  212.  im Haupt-Dialogfenster dienen zum Erzeugen der Animation ("Zeichnen", dient
  213.  auch zum Abbrechen des Skripts) und zum Beenden des Skripts ("Verlassen").
  214.  Es wird immer eine temporäre Kopie des aktuellen Pfades gespeichert, die bei
  215.  einem erneuten Aurufen des aktuellen Skripts geladen wird.
  216.  
  217.  Folgende Programmeinstellungen beeinflussen Erscheinungsbild und Qualität
  218.  der Animation: Der aktuelle Pinsel (zum Erzielen komplexer Animationseffekte
  219.  lassen sich Animationspinsel verwenden),die Griffpunktposition, der
  220.  Pinsel-Malmodus (und die Vordergrundfarbe bei aktivem "Farbe"-Modus), sowie
  221.  die Option "Farbe mit Größe ändern".
  222. */
  223.  
  224. /** ITA
  225.  Questo script permette di creare facilmente animazioni con oggetti
  226.  che si muovono e si trasformano.
  227.  
  228.  La finestra di dialogo principale mette a disposizione i seguenti comandi:
  229.  
  230.  - Nuovo: il percorso è cancellato e le trasformazioni del pennello
  231.    sono riportate a valori predefiniti.
  232.  
  233.  - Leggere: si può scegliere un file di percorso già esistente tramite la
  234.    finestra di scelta file; ciò comporta il caricamento delle coordinate del
  235.    percorso, delle impostazioni di trasformazione del pennello e di quelle
  236.    relative all'animazione (nota: tali dati sono immagazzinati in formato
  237.    ASCII e possono essere facilmente generati tramite algoritmi nonché
  238.    manipolati da altri programmi).
  239.  
  240.  - Scrivere: Questo comando salva un file di percorso usando i dato del percorso
  241.    attuale.
  242.  
  243.  - Definire a mano libera: si può usare il mouse per "tracciare" il percorso;
  244.    l'animazione risultante è influenzata sia dalla direzione del percorso sia
  245.    dalla velocità di spostamento del mouse: la direzione originale è usata
  246.    per disegnare i fotogrammi (il punto di partenza è utilizzato per piazzare
  247.    l'oggetto nel primo fotogramma e l'ultimo punto è usato per il fotogramma
  248.    finale) mentre la velocità del tracciamento influenza il numero e la
  249.    "densità" dei punti memorizzati (tanto è più lenta la velocità, tanto
  250.    maggiore il numero dei punti, e viceversa) e definisce la velocità
  251.    percepita dell'animazione (es. un percorso definito con una alta velocità
  252.    iniziale ed una bassa velocità finale porta ad una animazione con
  253.    caratteristiche corrispondenti). Per facilitare il posizionamento del
  254.    primo fotogramma, prima che sia premuto il pulsante del mouse viene
  255.    visualizzato il carattere. Il pulsante del mouse va rilasciato solo a
  256.    percorso completato.
  257.  
  258.  - Definire lineare: si può usare il mouse per definire un percorso lineare
  259.    (che consiste semplicemente di un punto di partenza e uno d'arrivo);
  260.    a differenza del percorso a mano libera, questo tipo di percorso produce
  261.    un'animazione a velocità costante (i punti intermedi sono generati in modo
  262.    automatico a distanze tra loro eguali). Per definire il percorso,
  263.    premere il pulsante sinistro del mouse all'inizio del percorso, e
  264.    rilasciarlo alla fine.
  265.  
  266.  - Modificare: si può usare questo comando per modificare in modo
  267.    visivo il percorso; i "punti del percorso" possono essere spostati col
  268.    mouse per cambiare la forma del percorso e/o la densità (velocità); il
  269.    tasto <m> attiva/disattiva l'ingrandimento, e il tasto destro del mouse
  270.    o il tasto <Esc> possono essere premuti per uscire dalla modalità di
  271.    modifica percorso.
  272.  
  273.  - Spostare e ridimensionare: si può usare il mouse per ridimensionare il
  274.    percorso dell'animazione (facendo click sulla parte inferiore destra dello
  275.    stesso) o spostarlo in una nuova posizione (facendo click sulla parte
  276.    superiore). Ciò è utile per creare percorsi con punti all'esterno dello
  277.    schermo, che non si possono piazzare manualmente. Il tasto <m>
  278.    attiva/disattiva l'ingrandimento, e il tasto destro del mouse o il tasto
  279.    <Esc> possono essere premuti per uscire dalla modalità di spostamento e
  280.    ridimensionamento.
  281.  
  282.  - Angolo pennello: si usa la finestra di dialogo Angolo pennello
  283.    per impostare il numero di rotazioni del pennello ("Cicli rotazione"),
  284.    l'angolo iniziale ("Da angolo") e finale ("Ad angolo"), e la direzione
  285.    della rotazione ("Senso": "Orario/Antiorario"); si può usare un numero di
  286.    rotazioni maggiore di 1 per aggiungere ulteriori avvitamenti a 360° nella
  287.    direzione specificata.
  288.  
  289.  - Inclinazione pennello: si usa la finestra di dialogo Inclinazione pennello
  290.    per impostare il numero di cicli di inclinazione ("Cicli inclinazione"), e
  291.    il livello di inclinazione iniziale e finale ("Da angolo", "Ad angolo");
  292.    se si specifica un numero di cicli di inclinazione maggiore di 1, i fattori
  293.    di inclinazione si sposteranno avanti ed indietro entro i limiti specificati
  294.    (si deve usare un numero dispari di cicli per raggiungere l'inclinazione
  295.    finale nell'ultimo fotogramma).
  296.  
  297.  - Dimensione pennello: si usa la finestra di dialogo Dimensione pennello per
  298.    impostare il numero di cicli di ridimensionamento ("Cicli
  299.    ridimensionamento"), la dimensione iniziale e finale in senso orizzontale
  300.    ("Da orizzontale" e "A orizzontale", in percentuale della dimensione
  301.    iniziale); la dimensione iniziale e finale in senso verticale ("Da
  302.    verticale", "A verticale"); se si specifica un numero di cicli
  303.    di ridimensionamento maggiore di 1, il fattore di ridimensionamento si
  304.    sposterà avanti ed indietro entro i limiti specificati (si deve usare un
  305.    numero dispari di cicli per raggiungere la dimensione finale nell'ultimo
  306.    fotogramma).
  307.  
  308.  - Dati: si usa la finestra di dialogo Dati percorso per vedere tutte
  309.    le informazioni relative al percorso con un solo colpo d'occhio
  310.    (impostazioni per animazione, rotazione, inclinazione, ridimensionamento,
  311.    seguite dalle coordinate del percorso).
  312.  
  313.  - Anteprima: si usa questo comando per vedere una anteprima dell'animazione;
  314.    quando sono implicati uno o più effetti relativi al pennello, l'immagine
  315.    dello stesso è sostituita da un contorno (la freccia interna indica la
  316.    sommità del pennello).
  317.  
  318.  La finestra principale contiene anche pulsanti per impostare il numero di
  319.  fotogrammi dell'animazione ("Passi"), la direzione di registrazione
  320.  ("Direzione": "Avanti/Indietro/Fermo" - il passo fotogramma) e l'opzione per
  321.  l'inserimento di fotogrammi ("Aggiunta fotogrammi" - se è attiva, saranno
  322.  inseriti tanti fotogrammi quanti indicato da "Passi").
  323.  
  324.  Quando si usano percorsi a mano libera senza effetti sul pennello, il numero
  325.  specificato in "Passi" non dovrebbe essere maggiore del numero di punti del
  326.  percorso (come riferito dalla finestra di dialogo Dati percorso), perché in
  327.  questo modo si otterrebbero uno o più fotogrammi doppi.
  328.  
  329.  Si possono usare i pulsanti sulla parte inferiore della finestra di dialogo
  330.  principale per realizzare l'animazione ("Animare", che inoltre fa terminare
  331.  lo script) o per uscire dallo script ("Uscire"). Il percorso attuale viene
  332.  temporaneamente "ricordato", perché sia possibile usarlo quando si avvia
  333.  nuovamente lo script.
  334.  
  335.  Le seguenti impostazioni del programma influenzano l'aspetto e la qualità
  336.  dell'animazione: pennello corrente (si possono usare anim-brush per creare
  337.  complessi effetti di animazione), posizione della maniglia di manipolazione
  338.  pennello, modo di disegno pennello (e colore di primo piano, se è attivo il
  339.  modo "Colore"), opzione di "Color average resize".
  340. */
  341.  
  342. IF ARG(1, EXISTS) THEN
  343.     PARSE ARG PPPORT
  344. ELSE
  345.     PPPORT = 'PPAINT'
  346.  
  347. IF ~SHOW('P', PPPORT) THEN DO
  348.     IF EXISTS('PPaint:PPaint') THEN DO
  349.         ADDRESS COMMAND 'Run >NIL: PPaint:PPaint'
  350.         DO 30 WHILE ~SHOW('P',PPPORT)
  351.              ADDRESS COMMAND 'Wait >NIL: 1 SEC'
  352.         END
  353.     END
  354.     ELSE DO
  355.         SAY "Personal Paint could not be loaded."
  356.         EXIT 10
  357.     END
  358. END
  359.  
  360. IF ~SHOW('P', PPPORT) THEN DO
  361.     SAY 'Personal Paint Rexx port could not be opened'
  362.     EXIT 10
  363. END
  364.  
  365. ADDRESS VALUE PPPORT
  366. OPTIONS RESULTS
  367. OPTIONS FAILAT 10000
  368.  
  369. Get 'LANG'
  370. IF RESULT = 1 THEN DO        /* Deutsch */
  371.     global.txt_title_menu  = 'AnimPinsel-Pfad'
  372.     global.txt_title_new   = 'Neuer Animationspfad'
  373.     global.txt_title_load  = 'Animationspfad laden'
  374.     global.txt_title_save  = 'Animationspfad speichern'
  375.     global.txt_title_fhand = 'Pfad frei festlegen'
  376.     global.txt_title_line  = 'Pfad linear festlegen'
  377.     global.txt_title_edit  = 'Animationspfad bearbeiten'
  378.     global.txt_title_movrs = 'Pfadposition/-größe ändern'
  379.     global.txt_title_brot  = 'Pinsel drehen'
  380.     global.txt_title_bshr  = 'Pinsel kippen'
  381.     global.txt_title_bresz = 'Pinselgröße'
  382.     global.txt_title_pview = 'Animationsvorschau'
  383.     global.txt_title_draw  = 'Animation zeichnen'
  384.     global.txt_title_data  = 'Pfadinformationen'
  385.  
  386.     global.txt_menu_new    = 'Neu'
  387.     global.txt_menu_load   = 'Laden...'
  388.     global.txt_menu_save   = 'Speichern...'
  389.     global.txt_menu_fhand  = 'Frei festlegen'
  390.     global.txt_menu_line   = 'Linear festlegen'
  391.     global.txt_menu_edit   = 'Bearbeiten'
  392.     global.txt_menu_movrs  = 'Position/Größe'
  393.     global.txt_menu_brot   = 'Pinsel drehen...'
  394.     global.txt_menu_bshr   = 'Pinsel kippen...'
  395.     global.txt_menu_bresz  = 'Pinselgröße...'
  396.     global.txt_menu_data   = 'Informationen...'
  397.     global.txt_menu_prview = 'Preview'
  398.  
  399.     global.txt_gad_count   = 'Z_ähler:'
  400.     global.txt_gad_add     = '_Frames add.:'
  401.     global.txt_gad_addf.0  = 'Nein'
  402.     global.txt_gad_addf.1  = 'Ja'
  403.     global.txt_gad_direct  = '_Richtung:'
  404.     global.txt_gad_dirct.0 = 'Vorwärts'
  405.     global.txt_gad_dirct.1 = 'Rückwärts'
  406.     global.txt_gad_dirct.2 = 'Stillstand'
  407.     global.txt_gad_draw    = '_Zeichnen'
  408.     global.txt_gad_quit    = '_Verlassen'
  409.     global.txt_gad_rotats  = '_Umdrehungen:'
  410.     global.txt_gad_fromang = '_Startwinkel:'
  411.     global.txt_gad_toang   = '_Zielwinkel:'
  412.     global.txt_gad_rotdir  = '_Richtung:'
  413.     global.txt_gad_rotdr.0 = 'Rechts herum'
  414.     global.txt_gad_rotdr.1 = 'Links herum'
  415.     global.txt_gad_shears  = '_Durchläufe:'
  416.     global.txt_gad_fromshx = '_Von Horizontal:'
  417.     global.txt_gad_toshx   = '_Bis Horizontal:'
  418.     global.txt_gad_fromshy = 'V_on Vertikal:'
  419.     global.txt_gad_toshy   = 'B_is Vertikal:'
  420.     global.txt_gad_resizes = '_Durchläufe:'
  421.     global.txt_gad_fromrsx = '_Von Horizontal (%):'
  422.     global.txt_gad_torsx   = '_Bis Horizontal (%):'
  423.     global.txt_gad_fromrsy = 'V_on Vertikal (%):'
  424.     global.txt_gad_torsy   = 'B_is Vertikal (%):'
  425.     global.txt_msg_points  = 'Punkte:'
  426.     global.txt_msg_ptype.0 = '(Freier Pfad)'
  427.     global.txt_msg_ptype.1 = '(Linearer Pfad)'
  428.  
  429.     global.txt_err_oldcl   = 'Dieses Skript erfordert eine neuere_Version von Personal Paint'
  430.     global.txt_err_lost    = 'Pfaddaten gehen verloren'
  431.     global.txt_err_load    = 'Pfaddatei kann nicht geöffnet werden'
  432.     global.txt_err_nopath  = 'Keine Pfaddefinition vorhanden'
  433.     global.txt_err_save    = 'Pfad kann nicht gespeichert werden'
  434.     global.txt_err_nocbsh  = 'Transformation läßt sich nur auf benutzer-_definierten Pinsel anwenden'
  435.     global.txt_err_notbsh  = 'Transformation nicht durchfürbar: Zu wenig Platz für temporären Pinsel'
  436.     global.txt_err_notmem  = 'Speichermangel'
  437. END
  438. ELSE IF RESULT = 2 THEN DO        /* Italiano */
  439.     global.txt_title_menu  = 'Percorso animazione'
  440.     global.txt_title_new   = 'Nuovo percorso animazione'
  441.     global.txt_title_load  = 'Leggere percorso animazione'
  442.     global.txt_title_save  = 'Scrivere percorso animazione'
  443.     global.txt_title_fhand = 'Definire a mano libera'
  444.     global.txt_title_line  = 'Definire lineare'
  445.     global.txt_title_edit  = 'Modificare percorso animazione'
  446.     global.txt_title_movrs = 'Spostare percorso animazione'
  447.     global.txt_title_brot  = 'Angolo pennello'
  448.     global.txt_title_bshr  = 'Inclinazione pennello'
  449.     global.txt_title_bresz = 'Dimensione pennello'
  450.     global.txt_title_pview = 'Anteprima animazione'
  451.     global.txt_title_draw  = 'Creare animazione'
  452.     global.txt_title_data  = 'Dati percorso animazione'
  453.  
  454.     global.txt_menu_new    = 'Nuovo'
  455.     global.txt_menu_load   = 'Leggere...'
  456.     global.txt_menu_save   = 'Scrivere...'
  457.     global.txt_menu_fhand  = 'Definire a mano libera'
  458.     global.txt_menu_line   = 'Definire lineare'
  459.     global.txt_menu_edit   = 'Modificare'
  460.     global.txt_menu_movrs  = 'Spostare e ridimensionare'
  461.     global.txt_menu_brot   = 'Angolo pennello...'
  462.     global.txt_menu_bshr   = 'Inclinazione pennello...'
  463.     global.txt_menu_bresz  = 'Dimensione pennello...'
  464.     global.txt_menu_data   = 'Dati...'
  465.     global.txt_menu_prview = 'Anteprima'
  466.  
  467.     global.txt_gad_count   = 'Pa_ssi:'
  468.     global.txt_gad_add     = 'Aggiunta _fotogrammi:'
  469.     global.txt_gad_addf.0  = 'No'
  470.     global.txt_gad_addf.1  = 'Sì'
  471.     global.txt_gad_direct  = 'Direzi_one:'
  472.     global.txt_gad_dirct.0 = 'Avanti'
  473.     global.txt_gad_dirct.1 = 'Indietro'
  474.     global.txt_gad_dirct.2 = 'Fermo'
  475.     global.txt_gad_draw    = '_Animare'
  476.     global.txt_gad_quit    = '_Uscire'
  477.     global.txt_gad_rotats  = 'Cicli _rotazione:'
  478.     global.txt_gad_fromang = '_Da angolo:'
  479.     global.txt_gad_toang   = 'Ad a_ngolo:'
  480.     global.txt_gad_rotdir  = '_Senso:'
  481.     global.txt_gad_rotdr.0 = 'Orario'
  482.     global.txt_gad_rotdr.1 = 'Antiorario'
  483.     global.txt_gad_shears  = 'Cicli _inclinazione:'
  484.     global.txt_gad_fromshx = '_Da orizzontale:'
  485.     global.txt_gad_toshx   = 'A ori_zzontale:'
  486.     global.txt_gad_fromshy = 'Da _verticale:'
  487.     global.txt_gad_toshy   = 'A ver_ticale:'
  488.     global.txt_gad_resizes = 'Cicli _ridimensionamento:'
  489.     global.txt_gad_fromrsx = '_Da orizzontale (%):'
  490.     global.txt_gad_torsx   = 'A ori_zzontale (%):'
  491.     global.txt_gad_fromrsy = 'Da _verticale (%):'
  492.     global.txt_gad_torsy   = 'A ver_ticale (%):'
  493.     global.txt_msg_points  = 'Punti:'
  494.     global.txt_msg_ptype.0 = '(percorso a mano libera)'
  495.     global.txt_msg_ptype.1 = '(percorso lineare)'
  496.  
  497.     global.txt_err_oldcl   = 'Questa procedura richiede_una versione più recente_di Personal Paint'
  498.     global.txt_err_lost    = 'Il percorso sarà cancellato'
  499.     global.txt_err_load    = 'Il file non può essere aperto'
  500.     global.txt_err_nopath  = 'Non è stato definito alcun percorso'
  501.     global.txt_err_save    = 'Il percorso non può essere scritto'
  502.     global.txt_err_nocbsh  = 'Le trasformazioni non possono essere applicate ai pennelli predefiniti'
  503.     global.txt_err_notbsh  = 'Le trasformationi non possono essere applicate: non vi è spazio per il pennello temporaneo'
  504.     global.txt_err_notmem  = 'Memoria insufficiente'
  505. END
  506. ELSE DO                /* English */
  507.     global.txt_title_menu  = 'Animation Path'
  508.     global.txt_title_new   = 'New Animation Path'
  509.     global.txt_title_load  = 'Load Animation Path'
  510.     global.txt_title_save  = 'Save Animation Path'
  511.     global.txt_title_fhand = 'Define Freehand Path'
  512.     global.txt_title_line  = 'Define Linear Path'
  513.     global.txt_title_edit  = 'Edit Animation Path'
  514.     global.txt_title_movrs = 'Move/Resize Animation Path'
  515.     global.txt_title_brot  = 'Brush Angle'
  516.     global.txt_title_bshr  = 'Brush Shear'
  517.     global.txt_title_bresz = 'Brush Size'
  518.     global.txt_title_pview = 'Preview Animation'
  519.     global.txt_title_draw  = 'Draw Animation'
  520.     global.txt_title_data  = 'Animation Path Data'
  521.  
  522.     global.txt_menu_new    = 'New'
  523.     global.txt_menu_load   = 'Load...'
  524.     global.txt_menu_save   = 'Save...'
  525.     global.txt_menu_fhand  = 'Define Freehand'
  526.     global.txt_menu_line   = 'Define Linear'
  527.     global.txt_menu_edit   = 'Edit'
  528.     global.txt_menu_movrs  = 'Move and Resize'
  529.     global.txt_menu_brot   = 'Brush Angle...'
  530.     global.txt_menu_bshr   = 'Brush Shear...'
  531.     global.txt_menu_bresz  = 'Brush Size...'
  532.     global.txt_menu_data   = 'Data...'
  533.     global.txt_menu_prview = 'Preview'
  534.  
  535.     global.txt_gad_count   = 'C_ount:'
  536.     global.txt_gad_add     = 'Add _Frames:'
  537.     global.txt_gad_addf.0  = 'No'
  538.     global.txt_gad_addf.1  = 'Yes'
  539.     global.txt_gad_direct  = 'Directi_on:'
  540.     global.txt_gad_dirct.0 = 'Forward'
  541.     global.txt_gad_dirct.1 = 'Backward'
  542.     global.txt_gad_dirct.2 = 'Still'
  543.     global.txt_gad_draw    = '_Draw'
  544.     global.txt_gad_quit    = '_Quit'
  545.     global.txt_gad_rotats  = '_Rotation Cycles:'
  546.     global.txt_gad_fromang = '_From Angle:'
  547.     global.txt_gad_toang   = '_To Angle:'
  548.     global.txt_gad_rotdir  = '_Direction:'
  549.     global.txt_gad_rotdr.0 = 'Clockwise'
  550.     global.txt_gad_rotdr.1 = 'Counterclockwise'
  551.     global.txt_gad_shears  = '_Shear Cycles:'
  552.     global.txt_gad_fromshx = '_From Horizontal:'
  553.     global.txt_gad_toshx   = '_To Horizontal:'
  554.     global.txt_gad_fromshy = 'F_rom Vertical:'
  555.     global.txt_gad_toshy   = 'T_o Vertical:'
  556.     global.txt_gad_resizes = 'Re_size Cycles:'
  557.     global.txt_gad_fromrsx = '_From Horizontal (%):'
  558.     global.txt_gad_torsx   = '_To Horizontal (%):'
  559.     global.txt_gad_fromrsy = 'F_rom Vertical (%):'
  560.     global.txt_gad_torsy   = 'T_o Vertical (%):'
  561.     global.txt_msg_points  = 'Points:'
  562.     global.txt_msg_ptype.0 = '(freehand path)'
  563.     global.txt_msg_ptype.1 = '(linear path)'
  564.  
  565.     global.txt_err_oldcl   = 'This script requires a newer_version of Personal Paint'
  566.     global.txt_err_lost    = 'The path will be lost'
  567.     global.txt_err_load    = 'The path file cannot be opened'
  568.     global.txt_err_nopath  = 'No path has been defined'
  569.     global.txt_err_save    = 'The path cannot be saved'
  570.     global.txt_err_nocbsh  = 'Transformation can only be applied to user brushes'
  571.     global.txt_err_notbsh  = 'Transformation cannot be applied: no space for temporary brush'
  572.     global.txt_err_notmem  = 'Not enough memory'
  573. END
  574.  
  575. Version 'REXX'
  576. IF RESULT < 7 THEN DO
  577.     RequestNotify 'PROMPT "'global.txt_err_oldcl'"'
  578.     EXIT 10
  579. END
  580.  
  581. tmpname = 'T:PP_AnimPath'
  582. global.pathdisp = 1
  583.  
  584. CALL DefData
  585.  
  586. LockGUI
  587.  
  588. GetPaintMode
  589. global.savepmode = RESULT
  590.  
  591. GetBrushAttributes 'WIDTH'
  592. global.bshw = RESULT
  593. GetBrushAttributes 'HEIGHT'
  594. global.bshh = RESULT
  595. GetBrushAttributes 'HANDLEX'
  596. global.bshhx = RESULT
  597. GetBrushAttributes 'HANDLEY'
  598. global.bshhy = RESULT
  599.  
  600. GetBrushAttributes 'FRAMES'
  601. global.savebshfr = RESULT
  602. GetBrushAttributes 'FRAMEPOSITION'
  603. global.savebshfp = RESULT
  604. GetBrushNumber
  605. global.savebshnum = RESULT
  606. GetCurrentBrush
  607. global.savebsh = RESULT
  608.  
  609. SetCurrentBrush 'UNUSED'
  610. IF RC ~= 0 THEN
  611.     global.tbshnum = 0
  612. ELSE DO
  613.     GetBrushNumber
  614.     global.tbshnum = RESULT
  615. END
  616.  
  617. SetCurrentBrush 'RECTANGULAR WIDTH 1 HEIGHT 1'
  618.  
  619. GetPen 'FOREGROUND'
  620. global.savepen = RESULT
  621. Get 'COLORS'
  622. global.xorpen = RESULT-1
  623. SetPen 'FOREGROUND' global.xorpen
  624.  
  625. Get 'BARS'
  626. savebars = RESULT
  627. Set '"BARS=0"'
  628.  
  629. Get 'GCLIP'
  630. saveclip = RESULT
  631. Set '"GCLIP=0"'
  632.  
  633. Get 'COORD'
  634. savecoord = RESULT
  635. Set '"COORD=0"'
  636.  
  637. DisableTools
  638. UnlockGUI
  639.  
  640. SIGNAL ON Break_C
  641.  
  642. /* load last used path and display it */
  643. CALL LoadPathFile(tmpname)
  644. CALL XorPath
  645.  
  646. Get 'SCREENH'
  647. IF RESULT < 206 THEN
  648.     mrows = 11
  649. ELSE
  650.     mrows = 12
  651.  
  652. command = 0
  653. DO FOREVER
  654.     Request '"'global.txt_title_menu'" COMPACT ',
  655.             '"LIST ACTION = , 12, 'command', 20, 'mrows', ',
  656.             ' ""'global.txt_menu_new'"", ',
  657.             ' ""'global.txt_menu_load'"", ',
  658.             ' ""'global.txt_menu_save'"", ',
  659.             ' ""'global.txt_menu_fhand'"", ',
  660.             ' ""'global.txt_menu_line'"", ',
  661.             ' ""'global.txt_menu_edit'"", ',
  662.             ' ""'global.txt_menu_movrs'"", ',
  663.             ' ""'global.txt_menu_brot'"", ',
  664.             ' ""'global.txt_menu_bshr'"", ',
  665.             ' ""'global.txt_menu_bresz'"", ',
  666.             ' ""'global.txt_menu_data'"", ',
  667.             ' ""'global.txt_menu_prview'"" ',
  668.             ' VSPACE = 4 ',
  669.             ' INTSTR = ""'global.txt_gad_count'"", 1, 32000, 'global.count' ',
  670.             ' VSPACE = 2 ',
  671.             ' CYCLE = ""'global.txt_gad_direct'"", 3, 'global.direct', ""'global.txt_gad_dirct.0'"", ""'global.txt_gad_dirct.1'"", ""'global.txt_gad_dirct.2'"" ' ||,
  672.             ' VSPACE = 2 ',
  673.             ' CHECK = ""'global.txt_gad_add'"", 'global.add' ' ||,
  674.             ' VSPACE = 2 ',
  675.             ' ACTION = ""'global.txt_gad_draw'"" ',
  676.             ' ACTION = ""'global.txt_gad_quit'"" "'
  677.     IF RC = 0 THEN DO
  678.         command = RESULT.1
  679.         global.count = RESULT.2
  680.         global.direct = RESULT.3
  681.         global.add = RESULT.4
  682.  
  683.         IF RESULT = 1 THEN DO    /* Draw */
  684.             IF DrawIt() THEN
  685.                 LEAVE
  686.         END
  687.         ELSE IF RESULT = 2 THEN    /* Quit */
  688.             LEAVE
  689.         ELSE DO     /* Command List */
  690.             IF      command = 0 THEN CALL NewPath
  691.             ELSE IF command = 1 THEN CALL LoadPath
  692.             ELSE IF command = 2 THEN CALL SavePath
  693.             ELSE IF command = 3 THEN CALL DefFreehand
  694.             ELSE IF command = 4 THEN CALL DefLinear
  695.             ELSE IF command = 5 THEN CALL EditPath
  696.             ELSE IF command = 6 THEN CALL MoveResizePath
  697.             ELSE IF command = 7 THEN CALL RotSettings
  698.             ELSE IF command = 8 THEN CALL ShearSettings
  699.             ELSE IF command = 9 THEN CALL ResizeSettings
  700.             ELSE IF command = 10 THEN CALL DisplayData
  701.             ELSE IF command = 11 THEN CALL PreviewPath
  702.         END
  703.     END
  704. END
  705.  
  706. CALL SavePathFile(tmpname)
  707. CALL Break_C
  708.  
  709. EXIT 0
  710.  
  711.  
  712.  
  713.  
  714.  
  715. DefData: PROCEDURE EXPOSE global.
  716.  
  717.     global.count  = 10
  718.     global.direct = 0
  719.     global.add    = 1
  720.  
  721.     global.rotats  = 1
  722.     global.fromang = 0 * 10000
  723.     global.toang   = 0 * 10000
  724.     global.rotdir  = 0
  725.  
  726.     global.shears  = 1
  727.     global.fromshx = 0
  728.     global.toshx   = 0
  729.     global.fromshy = 0
  730.     global.toshy   = 0
  731.  
  732.     global.resizes = 1
  733.     global.fromrsx = 100 * 10000
  734.     global.torsx   = 100 * 10000
  735.     global.fromrsy = 100 * 10000
  736.     global.torsy   = 100 * 10000
  737.  
  738.     global.points = 0
  739.     DROP global.xcoord. global.ycoord.
  740.  
  741.     RETURN
  742.  
  743.  
  744.  
  745.  
  746. NewPath: PROCEDURE EXPOSE global.
  747.  
  748.     RequestResponse 'TITLE "'global.txt_title_new'" PROMPT "'global.txt_err_lost'"'
  749.     IF RC = 0 THEN DO
  750.         IF global.points > 0 THEN
  751.             CALL XorPath
  752.  
  753.         CALL DefData
  754.     END
  755.  
  756.     RETURN
  757.  
  758.  
  759.  
  760.  
  761. LoadPathFile: PROCEDURE EXPOSE global.
  762.  
  763.     ok = 0
  764.     IF OPEN('pfile', ARG(1), 'R') THEN DO
  765.         LockGUI
  766.         IF READLN('pfile') = 'PPAINT PATH' THEN DO
  767.             IF READLN('pfile') = '1' THEN DO
  768.                 global.count  = READLN('pfile')
  769.                 global.direct = READLN('pfile')
  770.                 global.add    = READLN('pfile')
  771.  
  772.                 global.rotats  = READLN('pfile')
  773.                 global.fromang = READLN('pfile')
  774.                 global.toang   = READLN('pfile')
  775.                 global.rotdir  = READLN('pfile')
  776.  
  777.                 global.shears  = READLN('pfile')
  778.                 global.fromshx = READLN('pfile')
  779.                 global.toshx   = READLN('pfile')
  780.                 global.fromshy = READLN('pfile')
  781.                 global.toshy   = READLN('pfile')
  782.  
  783.                 global.resizes = READLN('pfile')
  784.                 global.fromrsx = READLN('pfile')
  785.                 global.torsx   = READLN('pfile')
  786.                 global.fromrsy = READLN('pfile')
  787.                 global.torsy   = READLN('pfile')
  788.  
  789.                 global.points = READLN('pfile')
  790.  
  791.                 DO point = 0 FOR global.points
  792.                     xy = READLN('pfile')
  793.                     PARSE VAR xy global.xcoord.point global.ycoord.point .
  794.                 END
  795.                 ok = 1
  796.             END
  797.         END
  798.         CALL CLOSE('pfile')
  799.         UnlockGUI
  800.     END
  801.  
  802.     RETURN ok
  803.  
  804.  
  805.  
  806.  
  807. LoadPath: PROCEDURE EXPOSE global.
  808.  
  809.     RequestFile 'TITLE "'global.txt_title_load'"'
  810.     IF RC = 0 THEN DO
  811.         PARSE VALUE RESULT WITH '"' pfilename '"'
  812.  
  813.         IF global.points > 0 THEN DO
  814.             CALL XorPath
  815.             CALL DefData
  816.         END
  817.  
  818.         IF LoadPathFile(pfilename) THEN
  819.             CALL XorPath
  820.         ELSE DO
  821.             CALL DefData
  822.             RequestNotify 'TITLE "'global.txt_title_load'" PROMPT "'global.txt_err_load'"'
  823.         END
  824.     END
  825.  
  826.     RETURN
  827.  
  828.  
  829.  
  830.  
  831. SavePathFile: PROCEDURE EXPOSE global.
  832.  
  833.     ok = 0
  834.     IF OPEN('pfile', ARG(1), 'W') THEN DO
  835.         LockGUI
  836.         CALL WRITELN('pfile', 'PPAINT PATH')
  837.         CALL WRITELN('pfile', '1')        /* version */
  838.  
  839.         CALL WRITELN('pfile', global.count)
  840.         CALL WRITELN('pfile', global.direct)
  841.         CALL WRITELN('pfile', global.add)
  842.  
  843.         CALL WRITELN('pfile', global.rotats)
  844.         CALL WRITELN('pfile', global.fromang)
  845.         CALL WRITELN('pfile', global.toang)
  846.         CALL WRITELN('pfile', global.rotdir)
  847.  
  848.         CALL WRITELN('pfile', global.shears)
  849.         CALL WRITELN('pfile', global.fromshx)
  850.         CALL WRITELN('pfile', global.toshx)
  851.         CALL WRITELN('pfile', global.fromshy)
  852.         CALL WRITELN('pfile', global.toshy)
  853.  
  854.         CALL WRITELN('pfile', global.resizes)
  855.         CALL WRITELN('pfile', global.fromrsx)
  856.         CALL WRITELN('pfile', global.torsx)
  857.         CALL WRITELN('pfile', global.fromrsy)
  858.         CALL WRITELN('pfile', global.torsy)
  859.  
  860.         CALL WRITELN('pfile', global.points)
  861.  
  862.         DO point = 0 FOR global.points
  863.             CALL WRITELN('pfile', global.xcoord.point' 'global.ycoord.point)
  864.         END
  865.         ok = 1
  866.         CALL CLOSE('pfile')
  867.         UnlockGUI
  868.     END
  869.  
  870.     RETURN ok
  871.  
  872.  
  873.  
  874.  
  875. SavePath: PROCEDURE EXPOSE global.
  876.  
  877.     IF global.points = 0 THEN DO
  878.         RequestNotify 'TITLE "'global.txt_title_save'" PROMPT "'global.txt_err_nopath'"'
  879.         RETURN
  880.     END
  881.  
  882.     RequestFile 'TITLE "'global.txt_title_save'" SAVEMODE'
  883.     IF RC = 0 THEN DO
  884.         PARSE VALUE RESULT WITH '"' pfilename '"'
  885.         IF ~SavePathFile(pfilename) THEN
  886.             RequestNotify 'TITLE "'global.txt_title_save'" PROMPT "'global.txt_err_save'"'
  887.     END
  888.  
  889.     RETURN
  890.  
  891.  
  892.  
  893.  
  894. XorVertex: PROCEDURE EXPOSE global.
  895.  
  896.     point = ARG(1)
  897.  
  898.     IF point > 0 THEN DO
  899.         IF point = 1 THEN
  900.             nfp = ''
  901.         ELSE
  902.             nfp = 'NOFIRSTPIXEL'
  903.         ppt = point - 1
  904.         DrawLine global.xcoord.ppt global.ycoord.ppt global.xcoord.point global.ycoord.point 'COMPLEMENT' nfp
  905.     END
  906.     npt = point + 1
  907.     IF npt < global.points THEN DO
  908.         IF point = 0 THEN
  909.             nfp = ''
  910.         ELSE
  911.             nfp = 'NOFIRSTPIXEL'
  912.         DrawLine global.xcoord.point global.ycoord.point global.xcoord.npt global.ycoord.npt 'COMPLEMENT' nfp
  913.     END
  914.  
  915.     RETURN
  916.  
  917.  
  918.  
  919.  
  920. EditPath: PROCEDURE EXPOSE global.
  921.  
  922.     IF global.points = 0 THEN DO
  923.         RequestNotify 'TITLE "'global.txt_title_edit'" PROMPT "'global.txt_err_nopath'"'
  924.         RETURN
  925.     END
  926.  
  927.     SetPointer 'DATA ',
  928.         '"0xC000,0x7000,0x3C00,0x3F00,0x1F00,0x1E00,0x0B00,0x0980,',
  929.         ' 0x0080,0x0000,0x0018,0x003C,0x0018,',
  930.         ' 0x4000,0xB000,0x4C00,0x4300,0x2000,0x2200,0x1500,0x1280,',
  931.         ' 0x0100,0x0000,0x0028,0x0044,0x0028" ',
  932.         'HEIGHT 13 OFFSETX -1 OFFSETY 0'
  933.  
  934.     DO FOREVER
  935.         WaitForClick 'DOWN POINT SHOWBRUSH'
  936.         IF RC = 0 THEN DO
  937.             PARSE VAR RESULT button xp yp .
  938.  
  939.             IF button > 1 THEN
  940.                 LEAVE
  941.             mindist = 30000
  942.             DO point = 0 FOR global.points
  943.                 GetDistance xp yp global.xcoord.point global.ycoord.point 'IMAGERATIO'
  944.                 IF RESULT < mindist THEN DO
  945.                     mindist = RESULT
  946.                     mindpt = point
  947.                 END
  948.             END
  949.             point = mindpt
  950.             prev_xp = xp
  951.             prev_yp = yp
  952.             drawn = 0
  953.  
  954.             DO FOREVER
  955.                 GetMousePosition
  956.                 PARSE VAR RESULT xp yp .
  957.  
  958.                 IF xp ~= prev_xp | yp ~= prev_yp | ~drawn THEN DO
  959.                     CALL XorVertex(point)
  960.                     global.xcoord.point = xp
  961.                     global.ycoord.point = yp
  962.                     CALL XorVertex(point)
  963.  
  964.                     prev_xp = xp
  965.                     prev_yp = yp
  966.                     drawn = 1
  967.                 END
  968.                 ELSE WaitForEvent
  969.  
  970.                 GetMouseButton
  971.                 IF RESULT = 0 THEN
  972.                     LEAVE
  973.             END
  974.         END
  975.         ELSE LEAVE
  976.     END
  977.     SetPointer
  978.     RETURN
  979.  
  980.  
  981.  
  982.  
  983. MoveResizePath: PROCEDURE EXPOSE global.
  984.  
  985.     IF global.points = 0 THEN DO
  986.         RequestNotify 'TITLE "'global.txt_title_movrs'" PROMPT "'global.txt_err_nopath'"'
  987.         RETURN
  988.     END
  989.  
  990.     SetPointer 'DATA ',
  991.         '"0xC000,0x7000,0x3C00,0x3F00,0x1FC0,0x1FC0,0x0F00,0x0D80,',
  992.         ' 0x04C0,0x0460,0x0020,',
  993.         ' 0x4000,0xB000,0x4C00,0x4300,0x20C0,0x2000,0x1100,0x1280,',
  994.         ' 0x0940,0x08A0,0x0040" ',
  995.         'HEIGHT 11 OFFSETX -1 OFFSETY 0'
  996.     minx = 32000
  997.     miny = 32000
  998.     maxx = -32000
  999.     maxy = -32000
  1000.     DO point = 0 FOR global.points
  1001.         IF global.xcoord.point < minx THEN minx = global.xcoord.point
  1002.         IF global.xcoord.point > maxx THEN maxx = global.xcoord.point
  1003.         IF global.ycoord.point < miny THEN miny = global.ycoord.point
  1004.         IF global.ycoord.point > maxy THEN maxy = global.ycoord.point
  1005.  
  1006.         origxc.point = global.xcoord.point
  1007.         origyc.point = global.ycoord.point
  1008.     END
  1009.     w1 = maxx - minx
  1010.     h1 = maxy - miny
  1011.     minx00 = minx
  1012.     miny00 = miny
  1013.     w100 = w1
  1014.     h100 = h1
  1015.  
  1016.     DO FOREVER
  1017.         WaitForClick 'DOWN POINT'
  1018.         IF RC = 0 THEN DO
  1019.             PARSE VAR RESULT button xp yp .
  1020.  
  1021.             IF button > 1 THEN
  1022.                 LEAVE
  1023.             resize = (xp > minx+w1/2 & yp > miny+h1/2)
  1024.             IF resize THEN DO
  1025.                 SetPointer 'DATA ',
  1026.                     '"0xC000,0x7000,0x3C00,0x3F00,0x1F00,0x1E00,0x0B00,0x0980,',
  1027.                     ' 0x00E0,0x00A0,0x00FE,0x0022,0x0022,0x0022,0x003E,',
  1028.                     ' 0x4000,0xB000,0x4C00,0x4300,0x2000,0x2200,0x1500,0x1280,',
  1029.                     ' 0x0100,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000" ',
  1030.                     'HEIGHT 15 OFFSETX -1 OFFSETY 0'
  1031.                 w10 = w1
  1032.                 h10 = h1
  1033.             END
  1034.             ELSE DO
  1035.                 minx0 = minx
  1036.                 miny0 = miny
  1037.             END
  1038.             CALL XorPath
  1039.             DrawRectangle minx miny maxx maxy 'COMPLEMENT'
  1040.             prev_xp = xp
  1041.             prev_yp = yp
  1042.  
  1043.             DO FOREVER
  1044.                 GetMousePosition
  1045.                 PARSE VAR RESULT xp yp .
  1046.  
  1047.                 IF xp ~= prev_xp | yp ~= prev_yp THEN DO
  1048.                     DrawRectangle minx miny maxx maxy 'COMPLEMENT'
  1049.                     IF resize THEN DO
  1050.                         w1 = w1 + (xp - prev_xp)
  1051.                         h1 = h1 + (yp - prev_yp)
  1052.                         IF w1 < 1 THEN w1 = 1
  1053.                         IF h1 < 1 THEN h1 = 1
  1054.                         maxx = minx + w1
  1055.                         maxy = miny + h1
  1056.                     END
  1057.                     ELSE DO
  1058.                         minx = minx + (xp - prev_xp)
  1059.                         miny = miny + (yp - prev_yp)
  1060.                         maxx = minx + w1
  1061.                         maxy = miny + h1
  1062.                     END
  1063.                     DrawRectangle minx miny maxx maxy 'COMPLEMENT'
  1064.                     prev_xp = xp
  1065.                     prev_yp = yp
  1066.                 END
  1067.                 ELSE WaitForEvent
  1068.  
  1069.                 GetMouseButton
  1070.                 IF RESULT = 0 THEN
  1071.                     LEAVE
  1072.             END
  1073.  
  1074.             DrawRectangle minx miny maxx maxy 'COMPLEMENT'
  1075.             IF resize THEN DO
  1076.                 IF w10 ~= w1 | h10 ~= h1 THEN DO
  1077.                     mx = w1 / w100
  1078.                     my = h1 / h100
  1079.                     DO point = 0 FOR global.points
  1080.                         global.xcoord.point = minx + TRUNC((origxc.point - minx00) * mx)
  1081.                         global.ycoord.point = miny + TRUNC((origyc.point - miny00) * my)
  1082.                     END
  1083.                 END
  1084.                 SetPointer 'DATA ',
  1085.                     '"0xC000,0x7000,0x3C00,0x3F00,0x1FC0,0x1FC0,0x0F00,0x0D80,',
  1086.                     ' 0x04C0,0x0460,0x0020,',
  1087.                     ' 0x4000,0xB000,0x4C00,0x4300,0x20C0,0x2000,0x1100,0x1280,',
  1088.                     ' 0x0940,0x08A0,0x0040" ',
  1089.                     'HEIGHT 11 OFFSETX -1 OFFSETY 0'
  1090.             END
  1091.             ELSE DO
  1092.                 IF minx ~= minx0 | miny ~= miny0 THEN DO
  1093.                     dx = minx - minx0
  1094.                     dy = miny - miny0
  1095.                     DO point = 0 FOR global.points
  1096.                         global.xcoord.point = global.xcoord.point + dx
  1097.                         global.ycoord.point = global.ycoord.point + dy
  1098.                     END
  1099.                 END
  1100.             END
  1101.             CALL XorPath
  1102.         END
  1103.         ELSE LEAVE
  1104.     END
  1105.     SetPointer
  1106.  
  1107.     RETURN
  1108.  
  1109.  
  1110.  
  1111.  
  1112. SetFirstBrush: PROCEDURE EXPOSE global.
  1113.  
  1114.     IF global.fromang = 0 & global.fromshx = 0 & global.fromshy = 0 & ,
  1115.          global.fromrsx = 1000000 & global.fromrsy = 1000000 THEN
  1116.         SetCurrentBrush global.savebsh
  1117.     ELSE DO
  1118.         SetCurrentBrush 'BRUSH' global.tbshnum
  1119.         IF RC ~= 0 THEN
  1120.             RETURN
  1121.         CopyBrush global.savebshnum 'NOFRAMES'
  1122.         IF RC ~= 0 THEN
  1123.             RETURN
  1124.  
  1125.         IF global.fromang ~= 0 THEN DO
  1126.             RotateBrush TRUNC(global.fromang / 10 + 0.5) 'NOPROGRESS'
  1127.             IF RC ~= 0 THEN
  1128.                 RETURN
  1129.         END
  1130.         IF global.fromshx ~= 0 | global.fromshy ~= 0 THEN DO
  1131.             shearx = TRUNC(global.fromshx + 0.5 * SIGN(global.fromshx))
  1132.             sheary = TRUNC(global.fromshy + 0.5 * SIGN(global.fromshy))
  1133.             ShearBrush shearx sheary 'NOPROGRESS'
  1134.             IF RC ~= 0 THEN
  1135.                 RETURN
  1136.         END
  1137.  
  1138.         IF global.fromrsx ~= 1000000 | global.fromrsy ~= 1000000 THEN DO
  1139.             GetBrushAttributes 'WIDTH'
  1140.             w = TRUNC(RESULT * (global.fromrsx / 1000000) + 0.5)
  1141.             GetBrushAttributes 'HEIGHT'
  1142.             h = TRUNC(RESULT * (global.fromrsy / 1000000) + 0.5)
  1143.             IF w < 1 THEN w = 1
  1144.             IF h < 1 THEN h = 1
  1145.             SetBrushAttributes 'WIDTH' w 'HEIGHT' h 'NOPROGRESS'
  1146.             IF RC ~= 0 THEN
  1147.                 RETURN
  1148.         END
  1149.     END
  1150.     SetPaintMode global.savepmode
  1151.     SetPen 'FOREGROUND' global.savepen
  1152.  
  1153.     RETURN
  1154.  
  1155.  
  1156.  
  1157.  
  1158. DefFreehand: PROCEDURE EXPOSE global.
  1159.  
  1160.     IF global.points > 0 THEN DO
  1161.         CALL XorPath
  1162.         DROP global.xcoord. global.ycoord.
  1163.         global.points = 0
  1164.     END
  1165.  
  1166.     LockGUI
  1167.     CALL SetFirstBrush
  1168.     UnlockGUI
  1169.  
  1170.     button = 0
  1171.     WaitForClick 'DOWN POINT SHOWBRUSH'
  1172.     IF RC = 0 THEN
  1173.         PARSE VAR RESULT button x0 y0 .
  1174.  
  1175.     SetCurrentBrush 'RECTANGULAR WIDTH 1 HEIGHT 1'
  1176.     SetPen 'FOREGROUND' global.xorpen
  1177.  
  1178.     IF button > 0 THEN DO
  1179.         prev_xp = x0
  1180.         prev_yp = y0
  1181.         global.xcoord.0 = x0
  1182.         global.ycoord.0 = y0
  1183.         point = 1
  1184.  
  1185.         DO FOREVER
  1186.             GetMousePosition
  1187.             PARSE VAR RESULT xp yp .
  1188.  
  1189.             IF xp ~= prev_xp | yp ~= prev_yp THEN DO
  1190.                 IF point = 1 THEN
  1191.                     nfp = ''
  1192.                 ELSE
  1193.                     nfp = 'NOFIRSTPIXEL'
  1194.                 DrawLine prev_xp prev_yp xp yp 'COMPLEMENT' nfp
  1195.  
  1196.                 global.xcoord.point = xp
  1197.                 global.ycoord.point = yp
  1198.                 point = point + 1
  1199.  
  1200.                 prev_xp = xp
  1201.                 prev_yp = yp
  1202.             END
  1203.             ELSE WaitForEvent
  1204.  
  1205.             GetMouseButton
  1206.             IF RESULT ~= button THEN
  1207.                 LEAVE
  1208.         END
  1209.         IF point = 1 THEN DO
  1210.             point = 2
  1211.             global.xcoord.1 = global.xcoord.0
  1212.             global.ycoord.1 = global.ycoord.0
  1213.         END
  1214.         global.points = point
  1215.     END
  1216.  
  1217.     RETURN
  1218.  
  1219.  
  1220.  
  1221.  
  1222. DefLinear: PROCEDURE EXPOSE global.
  1223.  
  1224.     IF global.points > 0 THEN DO
  1225.         CALL XorPath
  1226.         DROP global.xcoord. global.ycoord.
  1227.         global.points = 0
  1228.     END
  1229.  
  1230.     LockGUI
  1231.     CALL SetFirstBrush
  1232.     UnlockGUI
  1233.  
  1234.     button = 0
  1235.     WaitForClick 'DOWN POINT SHOWBRUSH'
  1236.     IF RC = 0 THEN
  1237.         PARSE VAR RESULT button x0 y0 .
  1238.  
  1239.     SetCurrentBrush 'RECTANGULAR WIDTH 1 HEIGHT 1'
  1240.     SetPen 'FOREGROUND' global.xorpen
  1241.  
  1242.     IF button > 0 THEN DO
  1243.         prev_xp = x0
  1244.         prev_yp = y0
  1245.         global.xcoord.0 = x0
  1246.         global.ycoord.0 = y0
  1247.         drawn = 0
  1248.  
  1249.         DO FOREVER
  1250.             GetMousePosition
  1251.             PARSE VAR RESULT xp yp .
  1252.  
  1253.             IF xp ~= prev_xp | yp ~= prev_yp | ~drawn THEN DO
  1254.                 IF drawn THEN
  1255.                     Undo
  1256.                 DrawLine x0 y0 xp yp 'COMPLEMENT'
  1257.  
  1258.                 global.xcoord.1 = xp
  1259.                 global.ycoord.1 = yp
  1260.                 prev_xp = xp
  1261.                 prev_yp = yp
  1262.                 drawn = 1
  1263.             END
  1264.             ELSE WaitForEvent
  1265.  
  1266.             GetMouseButton
  1267.             IF RESULT ~= button THEN
  1268.                 LEAVE
  1269.         END
  1270.         global.points = 2
  1271.     END
  1272.  
  1273.     RETURN
  1274.  
  1275.  
  1276.  
  1277.  
  1278. InitStep: PROCEDURE EXPOSE global.
  1279.  
  1280.     IF global.points = 2 THEN DO
  1281.         IF global.count > 1 THEN DO
  1282.             global.line_xs = (global.xcoord.1 - global.xcoord.0) / (global.count - 1)
  1283.             global.line_ys = (global.ycoord.1 - global.ycoord.0) / (global.count - 1)
  1284.         END
  1285.         ELSE DO
  1286.             global.line_xs = 0
  1287.             global.line_ys = 0
  1288.         END
  1289.         global.line_xp = global.xcoord.0
  1290.         global.line_yp = global.ycoord.0
  1291.     END
  1292.     ELSE DO
  1293.         global.point_s = global.points / global.count
  1294.         global.point_p = 0
  1295.     END
  1296.  
  1297.     IF global.fromang ~= global.toang | global.rotats > 1 THEN DO
  1298.         global.do_rot = 1
  1299.         IF global.fromang > global.toang & global.rotdir = 0 THEN
  1300.             rotdeg = (3600000 - global.fromang) + global.toang
  1301.         ELSE IF global.fromang < global.toang & global.rotdir = 1 THEN
  1302.             rotdeg = global.fromang + (3600000 - global.toang)
  1303.         ELSE
  1304.             rotdeg = ABS(global.toang - global.fromang)
  1305.  
  1306.         rotdeg = rotdeg + ((global.rotats - 1) * 3600000)
  1307.         IF global.count > 1 THEN
  1308.             global.rot_step =    rotdeg / (global.count - 1)
  1309.         ELSE
  1310.             global.rot_step =    0
  1311.         IF global.rotdir > 0 THEN
  1312.             global.rot_step = -global.rot_step
  1313.     END
  1314.     ELSE
  1315.         global.do_rot = 0
  1316.     global.rot_ang = global.fromang
  1317.  
  1318.     IF global.fromshx ~= global.toshx | global.fromshy ~= global.toshy | global.shears > 1 THEN DO
  1319.         global.do_shear = 1
  1320.         shearx = ABS(global.toshx - global.fromshx)
  1321.         IF global.count > 1 THEN
  1322.             global.shear_sx =    (shearx * global.shears) / (global.count - 1)
  1323.         ELSE
  1324.             global.shear_sx =    0
  1325.         IF global.toshx < global.fromshx THEN
  1326.             global.shear_sx = -global.shear_sx
  1327.         global.min_shx = MIN(global.fromshx, global.toshx)
  1328.         global.max_shx = MAX(global.fromshx, global.toshx)
  1329.  
  1330.         sheary = ABS(global.toshy - global.fromshy)
  1331.         IF global.count > 1 THEN
  1332.             global.shear_sy =    (sheary * global.shears) / (global.count - 1)
  1333.         ELSE
  1334.             global.shear_sy =    0
  1335.         IF global.toshy < global.fromshy THEN
  1336.             global.shear_sy = -global.shear_sy
  1337.         global.min_shy = MIN(global.fromshy, global.toshy)
  1338.         global.max_shy = MAX(global.fromshy, global.toshy)
  1339.     END
  1340.     ELSE
  1341.         global.do_shear = 0
  1342.     global.shear_x = global.fromshx
  1343.     global.shear_y = global.fromshy
  1344.  
  1345.     IF global.fromrsx ~= global.torsx | global.fromrsy ~= global.torsy | global.resizes > 1 THEN DO
  1346.         global.do_resize = 1
  1347.         resizex = ABS(global.torsx - global.fromrsx)
  1348.         IF global.count > 1 THEN
  1349.             global.resize_sx = (resizex * global.resizes) / (global.count - 1)
  1350.         ELSE
  1351.             global.resize_sx =    0
  1352.         IF global.torsx < global.fromrsx THEN
  1353.             global.resize_sx = -global.resize_sx
  1354.         global.min_rsx = MIN(global.fromrsx, global.torsx)
  1355.         global.max_rsx = MAX(global.fromrsx, global.torsx)
  1356.  
  1357.         resizey = ABS(global.torsy - global.fromrsy)
  1358.         IF global.count > 1 THEN
  1359.             global.resize_sy = (resizey * global.resizes) / (global.count - 1)
  1360.         ELSE
  1361.             global.resize_sy =    0
  1362.         IF global.torsy < global.fromrsy THEN
  1363.             global.resize_sy = -global.resize_sy
  1364.         global.min_rsy = MIN(global.fromrsy, global.torsy)
  1365.         global.max_rsy = MAX(global.fromrsy, global.torsy)
  1366.     END
  1367.     ELSE
  1368.         global.do_resize = 0
  1369.     global.resize_x = global.fromrsx
  1370.     global.resize_y = global.fromrsy
  1371.  
  1372.     global.do_transf = global.do_rot | global.rot_ang ~= 0 |,
  1373.                        global.do_shear | global.shear_x ~= 0 | global.shear_y ~= 0 |,
  1374.                        global.do_resize | global.resize_x ~= 1000000 | global.resize_y ~= 1000000
  1375.  
  1376.     RETURN
  1377.  
  1378.  
  1379.  
  1380.  
  1381. GetStep: PROCEDURE EXPOSE global.
  1382.  
  1383.     IF global.points = 2 THEN DO
  1384.         xp = TRUNC(global.line_xp + 0.5)
  1385.         yp = TRUNC(global.line_yp + 0.5)
  1386.     END
  1387.     ELSE DO
  1388.         point = TRUNC(global.point_p + 0.5)
  1389.         xp = global.xcoord.point
  1390.         yp = global.ycoord.point
  1391.     END
  1392.  
  1393.     RETURN xp yp
  1394.  
  1395.  
  1396.  
  1397.  
  1398. PreviewStep: PROCEDURE EXPOSE global.
  1399.  
  1400.     pos = ARG(1)
  1401.     IF global.do_transf THEN DO
  1402.         w = global.bshw
  1403.         h = global.bshh
  1404.         hx = global.bshhx
  1405.         hy = global.bshhy
  1406.  
  1407.         r.0.x = 0
  1408.         r.0.y = 0
  1409.         r.1.x = w - 1
  1410.         r.1.y = 0
  1411.         r.2.x = w - 1
  1412.         r.2.y = h - 1
  1413.         r.3.x = 0
  1414.         r.3.y = h - 1
  1415.  
  1416.         r.4.x = 0
  1417.         r.4.y = h % 2
  1418.         r.5.x = w % 2
  1419.         r.5.y = 0
  1420.         r.6.x = w - 1
  1421.         r.6.y = h % 2
  1422.  
  1423.         IF global.rot_ang ~= 0 THEN DO
  1424.             GetEllipsePoint 0 0 1000 1000 TRUNC(global.rot_ang / 10 + 0.5)
  1425.             PARSE VAR RESULT px py .
  1426.             spm = px / 1000
  1427.             cpm = -(py / 1000)
  1428.  
  1429.             minx = 32000
  1430.             miny = 32000
  1431.             maxx = -32000
  1432.             maxy = -32000
  1433.             DO pt = 0 TO 6
  1434.                 rptx = r.pt.x * cpm - r.pt.y * spm
  1435.                 rpty = r.pt.x * spm + r.pt.y * cpm
  1436.                 r.pt.x = TRUNC(rptx + 0.5 * SIGN(rptx))
  1437.                 r.pt.y = TRUNC(rpty + 0.5 * SIGN(rpty))
  1438.                 IF r.pt.x > maxx THEN maxx = r.pt.x
  1439.                 IF r.pt.y > maxy THEN maxy = r.pt.y
  1440.                 IF r.pt.x < minx THEN minx = r.pt.x
  1441.                 IF r.pt.y < miny THEN miny = r.pt.y
  1442.             END
  1443.             w = maxx - minx + 1
  1444.             h = maxy - miny + 1
  1445.  
  1446.             hx1 = hx * cpm - hy * spm
  1447.             hy1 = hx * spm + hy * cpm
  1448.             hx = TRUNC(hx1 + 0.5 * SIGN(hx1))
  1449.             hy = TRUNC(hy1 + 0.5 * SIGN(hy1))
  1450.         END
  1451.  
  1452.         IF global.shear_x ~= 0 | global.shear_y ~= 0 THEN DO
  1453.             w0 = w
  1454.             h0 = h
  1455.             shearx = TRUNC(global.shear_x + 0.5 * SIGN(global.shear_x))
  1456.             sheary = TRUNC(global.shear_y + 0.5 * SIGN(global.shear_y))
  1457.             w2 = w + ABS(shearx)
  1458.             h2 = h + ABS(sheary)
  1459.  
  1460.             minx = 32000
  1461.             miny = 32000
  1462.             DO pt = 0 TO 6
  1463.                 rptx = r.pt.x + (shearx * (r.pt.y / (h-1)))
  1464.                 rpty = r.pt.y + (sheary * (rptx / (w2-1)))
  1465.                 r.pt.x = TRUNC(rptx + 0.5 * SIGN(rptx))
  1466.                 r.pt.y = TRUNC(rpty + 0.5 * SIGN(rpty))
  1467.                 IF r.pt.x < minx THEN minx = r.pt.x
  1468.                 IF r.pt.y < miny THEN miny = r.pt.y
  1469.             END
  1470.             w = w2
  1471.             h = h2
  1472.             hx1 = hx * (w / w0) + minx
  1473.             hy1 = hy * (h / h0) + miny
  1474.             hx = TRUNC(hx1 + 0.5 * SIGN(hx1))
  1475.             hy = TRUNC(hy1 + 0.5 * SIGN(hy1))
  1476.         END
  1477.  
  1478.         IF global.resize_x ~= 1000000 | global.resize_y ~= 1000000 THEN DO
  1479.             multx = global.resize_x / 1000000
  1480.             multy = global.resize_y / 1000000
  1481.  
  1482.             DO pt = 0 TO 6
  1483.                 rptx = r.pt.x * multx
  1484.                 rpty = r.pt.y * multy
  1485.                 r.pt.x = TRUNC(rptx + 0.5 * SIGN(rptx))
  1486.                 r.pt.y = TRUNC(rpty + 0.5 * SIGN(rpty))
  1487.             END
  1488.  
  1489.             hx = TRUNC(hx * multx + 0.5 * SIGN(hx))
  1490.             hy = TRUNC(hy * multy + 0.5 * SIGN(hy))
  1491.         END
  1492.  
  1493.         PARSE VAR pos xpos ypos .
  1494.         pxseq = ''
  1495.         DO pt = 0 TO 6
  1496.             r.pt.x = xpos - hx + r.pt.x
  1497.             r.pt.y = ypos - hy + r.pt.y
  1498.             pxseq = pxseq r.pt.x r.pt.y
  1499.             IF pt = 3 | pt = 6 THEN DO
  1500.                 polypts.pt = pxseq
  1501.                 pxseq = ''
  1502.             END
  1503.         END
  1504.         Undo global.prvwundo
  1505.  
  1506.         IF ~global.add & global.prvwundo ~= 0 THEN DO
  1507.             IF global.direct = 0 THEN
  1508.                 SetFramePosition 'NEXT'
  1509.             ELSE IF global.direct = 1 THEN
  1510.                 SetFramePosition 'PREVIOUS'
  1511.         END
  1512.  
  1513.         DrawPolygon '"'polypts.3'" COMPLEMENT'
  1514.         DrawPolygon '"'polypts.6'" COMPLEMENT'
  1515.         global.prvwundo = 2
  1516.     END
  1517.     ELSE DO
  1518.         Undo global.prvwundo
  1519.  
  1520.         IF ~global.add & global.prvwundo ~= 0 THEN DO
  1521.             IF global.direct = 0 THEN
  1522.                 SetFramePosition 'NEXT'
  1523.             ELSE IF global.direct = 1 THEN
  1524.                 SetFramePosition 'PREVIOUS'
  1525.         END
  1526.  
  1527.         PutBrush pos
  1528.         global.prvwundo = 1
  1529.     END
  1530.  
  1531.     RETURN
  1532.  
  1533.  
  1534.  
  1535.  
  1536. NextStep: PROCEDURE EXPOSE global.
  1537.  
  1538.     IF global.points = 2 THEN DO
  1539.         global.line_xp = global.line_xp + global.line_xs
  1540.         global.line_yp = global.line_yp + global.line_ys
  1541.     END
  1542.     ELSE
  1543.         global.point_p = global.point_p + global.point_s
  1544.  
  1545.     IF global.do_rot THEN
  1546.         global.rot_ang = global.rot_ang + global.rot_step
  1547.  
  1548.     IF global.do_shear THEN DO
  1549.         global.shear_x = global.shear_x + global.shear_sx
  1550.         IF global.shear_sx > 0 THEN DO
  1551.             IF global.shear_x > global.max_shx THEN DO
  1552.                 excd = global.shear_x - global.max_shx
  1553.                 global.shear_x = global.max_shx - excd
  1554.                 global.shear_sx = -global.shear_sx
  1555.             END
  1556.         END
  1557.         ELSE DO
  1558.             IF global.shear_x < global.min_shx THEN DO
  1559.                 excd = global.min_shx - global.shear_x
  1560.                 global.shear_x = global.min_shx + excd
  1561.                 global.shear_sx = -global.shear_sx
  1562.             END
  1563.         END
  1564.  
  1565.         global.shear_y = global.shear_y + global.shear_sy
  1566.         IF global.shear_sy > 0 THEN DO
  1567.             IF global.shear_y > global.max_shy THEN DO
  1568.                 excd = global.shear_y - global.max_shy
  1569.                 global.shear_y = global.max_shy - excd
  1570.                 global.shear_sy = -global.shear_sy
  1571.             END
  1572.         END
  1573.         ELSE DO
  1574.             IF global.shear_y < global.min_shy THEN DO
  1575.                 excd = global.min_shy - global.shear_y
  1576.                 global.shear_y = global.min_shy + excd
  1577.                 global.shear_sy = -global.shear_sy
  1578.             END
  1579.         END
  1580.     END
  1581.  
  1582.     IF global.do_resize THEN DO
  1583.         global.resize_x = global.resize_x + global.resize_sx
  1584.         IF global.resize_sx > 0 THEN DO
  1585.             IF global.resize_x > global.max_rsx THEN DO
  1586.                 excd = global.resize_x - global.max_rsx
  1587.                 global.resize_x = global.max_rsx - excd
  1588.                 global.resize_sx = -global.resize_sx
  1589.             END
  1590.         END
  1591.         ELSE DO
  1592.             IF global.resize_x < global.min_rsx THEN DO
  1593.                 excd = global.min_rsx - global.resize_x
  1594.                 global.resize_x = global.min_rsx + excd
  1595.                 global.resize_sx = -global.resize_sx
  1596.             END
  1597.         END
  1598.  
  1599.         global.resize_y = global.resize_y + global.resize_sy
  1600.         IF global.resize_sy > 0 THEN DO
  1601.             IF global.resize_y > global.max_rsy THEN DO
  1602.                 excd = global.resize_y - global.max_rsy
  1603.                 global.resize_y = global.max_rsy - excd
  1604.                 global.resize_sy = -global.resize_sy
  1605.             END
  1606.         END
  1607.         ELSE DO
  1608.             IF global.resize_y < global.min_rsy THEN DO
  1609.                 excd = global.min_rsy - global.resize_y
  1610.                 global.resize_y = global.min_rsy + excd
  1611.                 global.resize_sy = -global.resize_sy
  1612.             END
  1613.         END
  1614.     END
  1615.  
  1616.     RETURN
  1617.  
  1618.  
  1619.  
  1620.  
  1621. PreviewBegin: PROCEDURE EXPOSE global.
  1622.  
  1623.     IF ~global.do_transf THEN DO
  1624.         SetCurrentBrush global.savebsh
  1625.         SetPaintMode global.savepmode
  1626.         SetPen 'FOREGROUND' global.savepen
  1627.     END
  1628.     GetFramePosition
  1629.     IF RC = 0 THEN
  1630.         global.savefrpos = RESULT
  1631.     ELSE
  1632.         global.savefrpos = 0
  1633.     global.prvwundo = 0
  1634.  
  1635.     RETURN
  1636.  
  1637.  
  1638.  
  1639.  
  1640. PreviewEnd: PROCEDURE EXPOSE global.
  1641.  
  1642.     Undo global.prvwundo
  1643.     IF ~global.do_transf THEN DO
  1644.         IF global.savebshfr > 1 THEN
  1645.             SetBrushAttributes 'FRAMEPOSITION' global.savebshfp
  1646.         SetCurrentBrush 'RECTANGULAR WIDTH 1 HEIGHT 1'
  1647.         SetPen 'FOREGROUND' global.xorpen
  1648.     END
  1649.     IF global.savefrpos > 0 THEN
  1650.         SetFramePosition global.savefrpos
  1651.  
  1652.     RETURN
  1653.  
  1654.  
  1655.  
  1656.  
  1657. PreviewPath: PROCEDURE EXPOSE global.
  1658.  
  1659.     IF global.points = 0 THEN DO
  1660.         RequestNotify 'TITLE "'global.txt_title_pview'" PROMPT "'global.txt_err_nopath'"'
  1661.         RETURN
  1662.     END
  1663.  
  1664.     CALL InitStep
  1665.  
  1666.     IF global.do_transf THEN DO
  1667.         IF WORD(global.savebsh, 1) ~= 'BRUSH' THEN DO
  1668.             RequestNotify 'TITLE "'global.txt_title_pview'" PROMPT "'global.txt_err_nocbsh'"'
  1669.             RETURN
  1670.         END
  1671.         IF global.tbshnum = 0 THEN DO
  1672.             RequestNotify 'TITLE "'global.txt_title_pview'" PROMPT "'global.txt_err_notbsh'"'
  1673.             RETURN
  1674.         END
  1675.     END
  1676.     LockGUI
  1677.     CALL XorPath
  1678.     CALL PreviewBegin
  1679.  
  1680.     DO cnt = 1 to global.count
  1681.         CALL PreviewStep( GetStep() )
  1682.         Wait 'TIME 200'
  1683.         CALL NextStep()
  1684.     END
  1685.     Wait 'TIME 200'
  1686.  
  1687.     CALL PreviewEnd
  1688.     CALL XorPath
  1689.     UnlockGUI
  1690.  
  1691.     RETURN
  1692.  
  1693.  
  1694.  
  1695.  
  1696. DrawStep: PROCEDURE EXPOSE global.
  1697.  
  1698.     pos = ARG(1)
  1699.     IF global.do_transf THEN DO
  1700.         SetCurrentBrush 'BRUSH' global.tbshnum
  1701.         IF RC ~= 0 THEN
  1702.             RETURN 0
  1703.         CopyBrush global.savebshnum 'NOFRAMES'
  1704.         IF RC ~= 0 THEN
  1705.             RETURN 0
  1706.  
  1707.         IF global.rot_ang ~= 0 THEN DO
  1708.             RotateBrush TRUNC(global.rot_ang / 10 + 0.5) 'NOPROGRESS'
  1709.             IF RC ~= 0 THEN
  1710.                 RETURN 0
  1711.         END
  1712.         IF global.shear_x ~= 0 | global.shear_y ~= 0 THEN DO
  1713.             shearx = TRUNC(global.shear_x + 0.5 * SIGN(global.shear_x))
  1714.             sheary = TRUNC(global.shear_y + 0.5 * SIGN(global.shear_y))
  1715.             ShearBrush shearx sheary 'NOPROGRESS'
  1716.             IF RC ~= 0 THEN
  1717.                 RETURN 0
  1718.         END
  1719.  
  1720.         IF global.resize_x ~= 1000000 | global.resize_y ~= 1000000 THEN DO
  1721.             GetBrushAttributes 'WIDTH'
  1722.             w = TRUNC(RESULT * (global.resize_x / 1000000) + 0.5)
  1723.             GetBrushAttributes 'HEIGHT'
  1724.             h = TRUNC(RESULT * (global.resize_y / 1000000) + 0.5)
  1725.             IF w < 1 THEN w = 1
  1726.             IF h < 1 THEN h = 1
  1727.             SetBrushAttributes 'WIDTH' w 'HEIGHT' h 'NOPROGRESS'
  1728.             IF RC ~= 0 THEN
  1729.                 RETURN 0
  1730.         END
  1731.         SetPaintMode global.savepmode
  1732.         SetPen 'FOREGROUND' global.savepen
  1733.         PutBrush pos
  1734.         FreeBrush 'FORCE'
  1735.         SetCurrentBrush global.savebsh
  1736.         IF RC ~= 0 THEN
  1737.             RETURN 0
  1738.  
  1739.         IF global.savebshfr > 1 THEN DO    /* get next frame */
  1740.             PutBrush '-1000 -1000'
  1741.             Undo
  1742.         END
  1743.     END
  1744.     ELSE
  1745.         PutBrush pos
  1746.  
  1747.     RETURN 1
  1748.  
  1749.  
  1750.  
  1751.  
  1752. DrawIt: PROCEDURE EXPOSE global.
  1753.  
  1754.     IF global.points = 0 THEN DO
  1755.         RequestNotify 'TITLE "'global.txt_title_draw'" PROMPT "'global.txt_err_nopath'"'
  1756.         RETURN 0
  1757.     END
  1758.  
  1759.     CALL InitStep
  1760.  
  1761.     IF global.do_transf THEN DO
  1762.         IF WORD(global.savebsh, 1) ~= 'BRUSH' THEN DO
  1763.             RequestNotify 'TITLE "'global.txt_title_draw'" PROMPT "'global.txt_err_nocbsh'"'
  1764.             RETURN 0
  1765.         END
  1766.         IF global.tbshnum = 0 THEN DO
  1767.             RequestNotify 'TITLE "'global.txt_title_draw'" PROMPT "'global.txt_err_notbsh'"'
  1768.             RETURN 0
  1769.         END
  1770.     END
  1771.  
  1772.     LockGUI
  1773.     CALL XorPath
  1774.     global.pathdisp = 0
  1775.     SetCurrentBrush global.savebsh
  1776.     SetPaintMode global.savepmode
  1777.     SetPen 'FOREGROUND' global.savepen
  1778.  
  1779.     IF global.add THEN DO
  1780.         GetFramePosition
  1781.         IF RC = 0 THEN
  1782.             frpos = RESULT
  1783.         ELSE
  1784.             frpos = 0
  1785.         AddFrames global.count
  1786.         IF global.direct = 1 THEN
  1787.             SetFramePosition frpos + global.count
  1788.     END
  1789.  
  1790.     DO cnt = 1 to global.count
  1791.         IF ~DrawStep( GetStep() ) THEN DO
  1792.             RequestNotify 'TITLE "'global.txt_title_draw'" PROMPT "'global.txt_err_notmem'"'
  1793.             LEAVE
  1794.         END
  1795.         IF global.direct = 0 THEN
  1796.             SetFramePosition 'NEXT'
  1797.         ELSE IF global.direct = 1 THEN
  1798.             SetFramePosition 'PREVIOUS'
  1799.         CALL NextStep()
  1800.     END
  1801.  
  1802.     IF global.savebshfr > 1 THEN
  1803.         SetBrushAttributes 'FRAMEPOSITION' global.savebshfp
  1804.     SetCurrentBrush 'RECTANGULAR WIDTH 1 HEIGHT 1'
  1805.     SetPen 'FOREGROUND' global.xorpen
  1806.     UnlockGUI
  1807.  
  1808.     RETURN 1
  1809.  
  1810.  
  1811.  
  1812.  
  1813. RotSettings: PROCEDURE EXPOSE global.
  1814.  
  1815.     Request '"'global.txt_title_brot'" ',
  1816.             '"INTSTR = ""'global.txt_gad_rotats'"", 1, 32000, 'global.rotats' ',
  1817.             ' INT10000STR = ""'global.txt_gad_fromang'"", 0, 3590000, 'global.fromang' ',
  1818.             ' INT10000STR = ""'global.txt_gad_toang'"", 0, 3590000, 'global.toang' ',
  1819.             ' CYCLE = ""'global.txt_gad_rotdir'"", 2, 'global.rotdir', ""'global.txt_gad_rotdr.0'"", ""'global.txt_gad_rotdr.1'"" "'
  1820.     IF RC = 0 THEN DO
  1821.         global.rotats = RESULT.1
  1822.         global.fromang = RESULT.2
  1823.         global.toang = RESULT.3
  1824.         global.rotdir = RESULT.4
  1825.     END
  1826.  
  1827.     RETURN
  1828.  
  1829.  
  1830.  
  1831.  
  1832. ShearSettings: PROCEDURE EXPOSE global.
  1833.  
  1834.     Request '"'global.txt_title_bshr'" ',
  1835.             '"INTSTR = ""'global.txt_gad_shears'"", 1, 32000, 'global.shears' ',
  1836.             ' INTSTR = ""'global.txt_gad_fromshx'"", -32000, 32000, 'global.fromshx' ',
  1837.             ' INTSTR = ""'global.txt_gad_toshx'"", -32000, 32000, 'global.toshx' ',
  1838.             ' INTSTR = ""'global.txt_gad_fromshy'"", -32000, 32000, 'global.fromshy' ',
  1839.             ' INTSTR = ""'global.txt_gad_toshy'"", -32000, 32000, 'global.toshy' "'
  1840.     IF RC = 0 THEN DO
  1841.         global.shears  = RESULT.1
  1842.         global.fromshx = RESULT.2
  1843.         global.toshx   = RESULT.3
  1844.         global.fromshy = RESULT.4
  1845.         global.toshy   = RESULT.5
  1846.     END
  1847.  
  1848.     RETURN
  1849.  
  1850.  
  1851.  
  1852.  
  1853. ResizeSettings: PROCEDURE EXPOSE global.
  1854.  
  1855.     Request '"'global.txt_title_bresz'" ',
  1856.             '"INTSTR = ""'global.txt_gad_resizes'"", 1, 32000, 'global.resizes' ',
  1857.             ' INT10000STR = ""'global.txt_gad_fromrsx'"", 00100, 320000000, 'global.fromrsx' ',
  1858.             ' INT10000STR = ""'global.txt_gad_torsx'"", 00100, 320000000, 'global.torsx' ',
  1859.             ' INT10000STR = ""'global.txt_gad_fromrsy'"", 00100, 320000000, 'global.fromrsy' ',
  1860.             ' INT10000STR = ""'global.txt_gad_torsy'"", 00100, 320000000, 'global.torsy' "'
  1861.     IF RC = 0 THEN DO
  1862.         global.resizes = RESULT.1
  1863.         global.fromrsx = RESULT.2
  1864.         global.torsx   = RESULT.3
  1865.         global.fromrsy = RESULT.4
  1866.         global.torsy   = RESULT.5
  1867.     END
  1868.  
  1869.     RETURN
  1870.  
  1871.  
  1872.  
  1873.  
  1874. DisplayData: PROCEDURE EXPOSE global.
  1875.  
  1876.     direct = global.direct
  1877.     add = global.add
  1878.     rotdir = global.rotdir
  1879.  
  1880.     str = COMPRESS(global.txt_gad_count, '_') global.count || '0A'x ||,
  1881.           COMPRESS(global.txt_gad_direct, '_') global.txt_gad_dirct.direct || '0A'x ||,
  1882.           COMPRESS(global.txt_gad_add, '_') global.txt_gad_addf.add || '0A'x ||,
  1883.           '0A'x ||,
  1884.           COMPRESS(global.txt_gad_rotats, '_') global.rotats || '0A'x ||,
  1885.           COMPRESS(global.txt_gad_fromang, '_') (global.fromang / 10000) || '0A'x ||,
  1886.           COMPRESS(global.txt_gad_toang, '_') (global.toang / 10000) || '0A'x ||,
  1887.           COMPRESS(global.txt_gad_rotdir, '_') global.txt_gad_rotdr.rotdir || '0A'x ||,
  1888.           '0A'x ||,
  1889.           COMPRESS(global.txt_gad_shears, '_') global.shears || '0A'x ||,
  1890.           COMPRESS(global.txt_gad_fromshx, '_') global.fromshx || '0A'x ||,
  1891.           COMPRESS(global.txt_gad_toshx, '_') global.toshx || '0A'x ||,
  1892.           COMPRESS(global.txt_gad_fromshy, '_') global.fromshy || '0A'x ||,
  1893.           COMPRESS(global.txt_gad_toshy, '_') global.toshy || '0A'x ||,
  1894.           '0A'x ||,
  1895.           COMPRESS(global.txt_gad_resizes, '_') global.resizes || '0A'x ||,
  1896.           COMPRESS(global.txt_gad_fromrsx, '_') (global.fromrsx / 10000) || '0A'x ||,
  1897.           COMPRESS(global.txt_gad_torsx, '_') (global.torsx / 10000) || '0A'x ||,
  1898.           COMPRESS(global.txt_gad_fromrsy, '_') (global.fromrsy / 10000) || '0A'x ||,
  1899.           COMPRESS(global.txt_gad_torsy, '_') (global.torsy / 10000) || '0A'x
  1900.  
  1901.     pos = 1
  1902.     DO FOREVER
  1903.         pos = INDEX(str, '"', pos)
  1904.         IF pos = 0 THEN
  1905.             BREAK
  1906.         str = INSERT('"', str, pos)
  1907.         pos = pos + 2
  1908.     END
  1909.  
  1910.     IF global.points > 0 THEN DO
  1911.         IF global.points = 2 THEN
  1912.             ptype = 1
  1913.         ELSE
  1914.             ptype = 0
  1915.  
  1916.         str = str ||,
  1917.               '0A'x ||,
  1918.               global.txt_msg_points global.points global.txt_msg_ptype.ptype || '0A'x ||,
  1919.               '0A'x
  1920.  
  1921.         DO point = 0 FOR global.points
  1922.             str = str || global.xcoord.point','global.ycoord.point || '0A'x
  1923.         END
  1924.     END
  1925.     RequestNotify '"'global.txt_title_data'" "'str'" SCROLL'
  1926.  
  1927.     RETURN
  1928.  
  1929.  
  1930.  
  1931.  
  1932. XorPath: PROCEDURE EXPOSE global.
  1933.  
  1934.     IF global.points > 0 THEN DO
  1935.         xp = global.xcoord.0
  1936.         yp = global.ycoord.0
  1937.         last = global.points - 1
  1938.  
  1939.         DO point = 1 TO last
  1940.             IF point = 1 THEN
  1941.                 nfp = ''
  1942.             ELSE
  1943.                 nfp = 'NOFIRSTPIXEL'
  1944.             DrawLine xp yp global.xcoord.point global.ycoord.point 'COMPLEMENT' nfp
  1945.  
  1946.             xp = global.xcoord.point
  1947.             yp = global.ycoord.point
  1948.         END
  1949.     END
  1950.  
  1951.     RETURN
  1952.  
  1953.  
  1954.  
  1955.  
  1956. Cleanup: PROCEDURE EXPOSE global.
  1957.  
  1958.     IF global.pathdisp THEN DO
  1959.         LockGUI
  1960.         CALL XorPath
  1961.         UnlockGUI
  1962.     END
  1963.  
  1964.     RETURN
  1965.  
  1966.  
  1967.  
  1968.  
  1969. Break_C:
  1970.  
  1971.     CALL Cleanup
  1972.  
  1973.     LockGUI
  1974.     SetPen 'FOREGROUND' global.savepen
  1975.     SetCurrentBrush global.savebsh
  1976.     SetPaintMode global.savepmode
  1977.     IF global.savebshfr > 1 THEN
  1978.         SetBrushAttributes 'FRAMEPOSITION' global.savebshfp
  1979.     Set '"BARS='savebars'"'
  1980.     Set '"GCLIP='saveclip'"'
  1981.     Set '"COORD='savecoord'"'
  1982.     EnableTools
  1983.     UnlockGUI
  1984.  
  1985.     RETURN
  1986.